Set hidden network group name at time of association
authorSamuel Ortiz <sameo@linux.intel.com>
Fri, 10 Jul 2009 22:32:00 +0000 (00:32 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 11 Jul 2009 19:44:41 +0000 (12:44 -0700)
We want to keep hidden network's group as hidden_BSSID_mode_security in order
to store them with this name and match them properly against our initial scan
results.
To achieve that we need to set a joined network group at associated time since
we don't know its BSSID before that.

include/network.h
plugins/supplicant.c
src/device.c
src/network.c
src/service.c

index 8d9a2fd..0498109 100644 (file)
@@ -69,6 +69,7 @@ void connman_network_set_protocol(struct connman_network *network,
                                        enum connman_network_protocol protocol);
 void connman_network_set_group(struct connman_network *network,
                                                const char *group);
+const char *connman_network_get_group(struct connman_network *network);
 
 int connman_network_set_available(struct connman_network *network,
                                                connman_bool_t available);
index ea348ec..832509a 100644 (file)
@@ -1423,6 +1423,43 @@ static int task_connect(struct supplicant_task *task)
        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;
@@ -1479,6 +1516,32 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg)
        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;
index 563bf2d..4a4d2e8 100644 (file)
@@ -636,8 +636,6 @@ static DBusMessage *join_network(DBusConnection *conn,
 
        group = build_group(ssid, ssid_size, mode, security);
 
-       connman_network_set_group(network, group);
-
        index = connman_device_get_index(device);
        connman_network_set_index(network, index);
 
index 45284fa..c4dabce 100644 (file)
@@ -629,7 +629,7 @@ void connman_network_set_group(struct connman_network *network,
                __connman_profile_add_network(network);
 }
 
-const char *__connman_network_get_group(struct connman_network *network)
+const char *connman_network_get_group(struct connman_network *network)
 {
        return network->group;
 }
index da75ca7..d44e91b 100644 (file)
@@ -1313,7 +1313,7 @@ struct connman_service *__connman_service_lookup_from_network(struct connman_net
        if (ident == NULL)
                return NULL;
 
-       group = __connman_network_get_group(network);
+       group = connman_network_get_group(network);
        if (group == NULL)
                return NULL;
 
@@ -1459,7 +1459,7 @@ struct connman_service *__connman_service_create_from_network(struct connman_net
        if (ident == NULL)
                return NULL;
 
-       group = __connman_network_get_group(network);
+       group = connman_network_get_group(network);
        if (group == NULL)
                return NULL;